#pragma once
//网页渲染模块

#include<iostream>
#include<string>
#include<ctemplate/template.h>

#include"oj_model_mysql.hpp"

namespace ns_view
{
    using namespace ns_model;

    const string template_path = "./template_html/";//待渲染网页的路径

    class View
    {
    public:

        View(){}
        ~View(){}

        //渲染包含全部题目的页面(题目列表)
        void AllExpandHtml(const vector<struct Question>& questions, string* html)
        {
            //三个信息：题目编号 题目标题 题目难度
            string src_html = template_path + "all_questions.html";//要被渲染的网页路径

            //构建字典映射
            ctemplate::TemplateDictionary root("all_questions");//创建数据 根字典

            //多道题目，所以需要循环写入
            for(const auto& q : questions)
            {
                ctemplate::TemplateDictionary* sub = root.AddSectionDictionary("question_list");//创建数据子字典
                sub->SetValue("number", q.number);
                sub->SetValue("title", q.title);
                sub->SetValue("star", q.star);
            }

            //获取被渲染的网页
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            //开始渲染
            tpl->Expand(html, &root);
        }

        //渲染指定题目的页面(单个题目的全部信息)
        void OneExpandHtml(const struct Question& q, string* html)
        {
            //获取要被渲染的网页的路径
            string src_html = template_path + "one_question.html";

            //创建字典映射
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number", q.number);
            root.SetValue("title", q.title);
            root.SetValue("star", q.star);
            root.SetValue("desc", q.desc);
            root.SetValue("pre_code", q.header);

            //获取待渲染页面
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);//不进行格式优化

            //渲染
            tpl->Expand(html, &root);//用字典数据渲染网页
        }
    };
}